
package model.dao;

import model.domain.bd.BaseDatos;
import model.domain.bd.Tabla;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import model.domain.bd.Registro;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class PDAParserXML {
    
    public static void main(String[] args) {
        try {
            BaseDatos bd = new BaseDatos();                    
            PDAParserXML.parsear(bd,"C:/temp/product.xml");
            System.out.println(bd);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
    public static void parsear(BaseDatos bd, String archivoXML) throws Exception {
        //BD bd = new BD();
        
        //1.Leyendo archivo XML
        //File fXmlFile = new File("C:/temp/product.xml");
        File fXml = new File(archivoXML);            
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXml);
        Element eRaiz = doc.getDocumentElement();
        
        //2. opcional. Normalizando todos los nodos del XML
        //read this - http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
        eRaiz.normalize();

        //System.out.println("Elemento raiz:" + eRaiz.getNodeName());          
        //System.out.println("-----------------------------------------------------");

        //ln: lista de nodos
        //hs: hijos
        //h: hijo
        //n: nodo
        
        NodeList lnTablas = doc.getElementsByTagName("TABLAS");
        Node nTablas = lnTablas.item(0);
        NodeList hsTablas = nTablas.getChildNodes();
        
        int nhsTablas = hsTablas.getLength();//numero de tablas
        for (int i = 0; i < nhsTablas; i++) {
            Node hTablas = hsTablas.item(i);

            //descartando los nodos de tipo texto                                
            if(hTablas.getNodeType()==Node.TEXT_NODE)//if(nTabla.getNodeName().equals("#text"))
                continue;           
                        
            Tabla tabla = new Tabla();
            parsear(tabla,hTablas);
            bd.addTabla(tabla);
        }        
        
        //return bd;
    }
    
    //public static void parsearTabla(Tabla tabla, Node nTabla) {
    public static void parsear(Tabla tabla, Node nTabla) {
        tabla.setNombre( nTabla.getNodeName() );
        //System.out.println(tabla.getNombre());

        NodeList lsRegistro = ((Element) nTabla).getElementsByTagName("Registro");
        int nr = lsRegistro.getLength();            

        //NodeList hsTabla = nTabla.getChildNodes();
        //int nhsTabla = hsTabla.getLength();
        for (int r = 0; r < nr; r++) {//for (int j = 0; j < nhsTabla; j++) {
            // Node hTabla = hsTabla.item(j);
            // if(hTabla.getNodeType()==Node.TEXT_NODE)
            //      continue;
            
            //System.out.println("REGISTRO "+r);

            //B. Parseando Nodo Registro
            Registro registro = new Registro();
            parsear(registro,lsRegistro.item(r));//Node nRegistro = hTabla;
            tabla.addRegistro(registro);
        }    
    }
    
    //public static void parsearRegistro(Registro registro, Node nRegistro) {
    public static void parsear(Registro registro, Node nRegistro) {
        NodeList hsRegistro = nRegistro.getChildNodes();                       
        int nhsRegistro = hsRegistro.getLength();//numero de hijos del nodo registro
        
        for (int k = 0; k < nhsRegistro ; k++) {
            Node hRegistro = hsRegistro.item(k);

            //descartando los nodos de tipo texto                                
            if(hRegistro.getNodeType()==Node.TEXT_NODE)
                continue;

            Node nValor = hRegistro;           
            Node hValor = nValor.getChildNodes().item(0);

            String campo = nValor.getNodeName();            
            //System.out.println("  "+campo+"="+hValor);
            String valor = hValor==null? null : hValor.getNodeValue();
            
            registro.addValor(campo, valor);                        
        }
    }
}
